package org.summerframework.component.security.core.service;

import org.summerframework.component.security.context.RequestContext;
import org.summerframework.component.security.LoginData;
import org.summerframework.component.security.enumeration.LoginTypeEnum;
import org.summerframework.core.util.config.ConfigUtils;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.servlet.ModelAndView;

/**
 * 登录管理,处理 {@link LoginTypeEnum} 中的类型登录
 * {@link LoginService} 为处理类 hasParseLoginTypeEnum 方法允许处理
 * <p>
 * 以以下方式获取loginServices:
 * <code>
 * <p>
 * &#064;Resource
 * private List&lt;LoginService&gt; loginServices;
 * </code>
 * <p>
 * <p>
 * 如果有重复的处理方式,请设置spring的order参数 {@link org.springframework.core.annotation.Order}
 * <p>
 * <p>
 * 返回页面
 * <p>
 * json=0:页面    PS:获取方式  {@link ConfigUtils#getProperties()} login.page.result.view.styleVaule
 * json=1:json   PS:获取方式  {@link ConfigUtils#getProperties()} login.json.result.view.styleVaule
 * <p>
 * style: 页面风格   PS:配合json使用
 *
 * @author 石超
 * @version v1.0.0
 */
public interface LoginManage {
    /**
     * 登录 {@link LoginService}
     *
     * @param context 请求上下文
     * @return view
     */
    @Transactional(rollbackFor = Exception.class)
    <T> ModelAndView login(RequestContext<LoginData<T>> context);

    /**
     * 登录 {@link LoginService}
     *
     * @param context 请求上下文
     * @return view
     */
    @Transactional(rollbackFor = Exception.class)
    <T> ModelAndView login(RequestContext<LoginData<T>> context, Integer loginType);

    /**
     * 获取loginservice
     *
     * @param loginTypeEnum 类型
     * @return loginService
     */
    LoginService getLoginService(Integer loginTypeEnum);
}
